package com.ehsy.statement;

import com.dtflys.forest.Forest;
import com.dtflys.forest.config.ForestConfiguration;
import com.dtflys.forest.exceptions.ForestRuntimeException;
import com.dtflys.forest.http.ForestRequest;
import com.dtflys.forest.http.ForestResponse;
import com.ehsy.common.ResponseVo;
import com.ehsy.model.UserInfo;
import com.ehsy.service.AsynService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * @author YanZhen_Li
 * @version 1.0
 * @title A17
 * @description
 * @create 2024/6/19 11:50
 */
@SpringBootTest
public class A17异步请求 {
    @Resource
    AsynService service;

    /**
     * 简单异步请求，无论是否访问成功我们都不会有返回值，方法异步执行
     */
    @Test
    public void test1() throws InterruptedException {
        // ! 因为我在后台为了模拟响应速度蛮，所以我这里需要设置超时时间长一点，防止太长时间没响应导致了超时
        // 创建Forest配置对象
        ForestConfiguration configuration = Forest.config();
        // 设置连接超时时间（单位：毫秒）
        configuration.setConnectTimeout(10000);
        // 设置读取超时时间（单位：毫秒）
        configuration.setReadTimeout(10000);

        UserInfo user = new UserInfo("张三", "18", "男", "上海", "13812341234", "123@qq.com", "123456");
        ResponseVo<UserInfo> test1 = service.test1(user, 5000);
        System.out.println(test1);
        Thread.sleep(10000);
        System.out.println(test1);
    }

    /**
     * 异步执行，使用回调函数处理异步结果
     */
    @Test
    public void test2() throws InterruptedException {
        // ! 因为我在后台为了模拟响应速度蛮，所以我这里需要设置超时时间长一点，防止太长时间没响应导致了超时
        // 创建Forest配置对象
        ForestConfiguration configuration = Forest.config();
        // 设置连接超时时间（单位：毫秒）
        configuration.setConnectTimeout(10000);
        // 设置读取超时时间（单位：毫秒）
        configuration.setReadTimeout(10000);

        UserInfo user = new UserInfo("张三", "18", "男", "上海", "13812341234", "123@qq.com", "123456");
        service.test2(user, 5000, (ResponseVo<UserInfo> data, ForestRequest req, ForestResponse res) ->{
            System.out.println("执行成功");
            System.out.println(data);
        }, (ForestRuntimeException ex, ForestRequest req, ForestResponse res) ->{
            System.out.println("执行失败");
        });
        // 线程休眠10秒，确保异步请求执行完毕
        Thread.sleep(10000);
    }

    /**
     * 使用Future接受异步数据
     */
    @Test
    public void test3() throws InterruptedException, ExecutionException {
        // ! 因为我在后台为了模拟响应速度蛮，所以我这里需要设置超时时间长一点，防止太长时间没响应导致了超时
        // 创建Forest配置对象
        ForestConfiguration configuration = Forest.config();
        // 设置连接超时时间（单位：毫秒）
        configuration.setConnectTimeout(10000);
        // 设置读取超时时间（单位：毫秒）
        configuration.setReadTimeout(10000);

        UserInfo user = new UserInfo("张三", "18", "男", "上海", "13812341234", "123@qq.com", "123456");
        Future<ResponseVo<UserInfo>> future = service.test3(user, 5000);
        // 等待接受数据
        ResponseVo<UserInfo> userInfoResponseVo = future.get();
        System.out.println(userInfoResponseVo);
    }
}
